/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.svh.Controlador;

import com.svh.Entidad.Empleado;
import com.svh.Entidad.Local;
import com.svh.Entidad.Perfil;
import com.svh.Entidad.TipoEmpleado;
import com.svh.Entidad.Usuario;
import com.svh.Paginator.EmpleadoPaginador;
import static com.svh.Paginator.EmpleadoPaginador.WITH_USER;
import com.svh.Paginator.Paginador;
import com.svh.Servicios.EmpleadoServicio;
import com.svh.Servicios.UsuarioServicio;
import com.svh.Utils.ExcelExporter;
import com.svh.Utils.Exporter;
import com.svh.Utils.Utilitario;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
@ManagedBean(name = "empleadoControlador")
@ViewScoped
public class EmpleadoControlador implements Serializable {

    private EmpleadoServicio emplservicio;
    private Empleado empleado;
    private UsuarioServicio uservicio;
    private List<TipoEmpleado> tiposEmpleado;
    private LazyDataModel<Empleado> empleados;
    TipoEmpleado templeado;

    private LazyDataModel<Usuario> usuarios;
    private List<Usuario> usuario; 
    Perfil perfil;  
    UsuarioServicio usuarioServicio;
    List<Perfil> perfiles;
    Usuario user;

    @ManagedProperty("#{sesionControlador}")
    SesionControlador sesionControlador;

    public EmpleadoControlador() {

    }

    public void initLista() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            empleados = new Paginador<Empleado>(new EmpleadoPaginador(EmpleadoPaginador.ALL));
            sesionControlador.generarModulo(8);//*** NUMERO MAGICO T_T

        }
    }

    public void initRegistrar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            empleado = new Empleado();
            emplservicio = new EmpleadoServicio();
            tiposEmpleado = emplservicio.obtenerTiposEmpleados();
        }
    }

    public void initActualizar() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idEmpleado");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/empleado/list.xhtml");
                return;
            }
            templeado = new TipoEmpleado();
            emplservicio = new EmpleadoServicio();
            empleado = emplservicio.obtenerEmpleadoporid((Integer) parametro);
            templeado.setId(empleado.getTipo().getId());
            tiposEmpleado = emplservicio.obtenerTiposEmpleados();
        }
    }

    public void initActualizarPass() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            Object parametro = Utilitario.getFlash("idEmpleado");
            if (parametro == null) {
                Utilitario.redireccionarJSF(FacesContext.getCurrentInstance(), "/views/empleadoUser/list.xhtml");
                return;
            }
            //templeado = new TipoEmpleado();
            emplservicio = new EmpleadoServicio();
            user = new Usuario();
            empleado = emplservicio.obtenerEmpleadoporid((Integer) parametro);
         // templeado.setId(empleado.getTipo().getId());
            user.setId(empleado.getUsuario().getId());
           tiposEmpleado = emplservicio.obtenerTiposEmpleados();
              usuario = emplservicio.obtenerUsuarios();
          
            
          
            
            perfil = new Perfil();
              usuarioServicio = new UsuarioServicio();
                user = usuarioServicio.obtenerUsuarioPorId((Integer) parametro);
              perfil.setId(user.getPerfil().getId());
            perfiles = usuarioServicio.obtenerPerfiles();
            
        
           
        }
    }

     ////////////////
    public void crearEmpleado() {
        if (!esVistaValida()) {
            return;
        }
        emplservicio.regEmpleados(empleado);
        limpiar();
    }

    public void actualiza() {
        if (!esVistaValida()) {
            return;
        }   
       emplservicio.actEmpleado(empleado);
       
    }
     

    public String irActualizar(int id) {
        Utilitario.putFlash("idEmpleado", id);
        return "update.xhtml?faces-redirect=true";
    }
    
    public String ir(){
        Utilitario.putFlash("empleado", empleado);
        return "lista2.xhtml?faces-redirect=true";
    }

    private boolean esVistaValida() {
        boolean resultado = true;
        if (!nombrevalido()) {
            resultado = false;
        } else if (!esApellidoPaterno()) {
            resultado = false;
        } else if (!esApellidoMaterno()) {
            resultado = false;
        } else if (!esTipoEmpleadoValido()) {
            resultado = false;
            Utilitario.enviarMensajeGlobalError("Debe seleccionar un tipo de Empleado");
        } else if (!esTelefono()) {
            resultado = false;
        } else if (!esCelular()) {
            resultado = false;
        } else if (!esDireccion()) {
            resultado = false;
        } else if (!esDNI()) {
            resultado = false;
        }
        return resultado;
    }

    private boolean nombrevalido() {
        boolean resultado = true;

        if (Utilitario.esNulo(empleado.getNombre().trim())) {
            Utilitario.enviarMensajeGlobalError("Ingrese nombre");
            resultado = false;
        } else if (!Utilitario.esRangoValido(empleado.getNombre(), 45)) {
            Utilitario.enviarMensajeGlobalError("El máximo de caracteres para el nombre es 45 ");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(empleado.getNombre())) {
            Utilitario.enviarMensajeGlobalError("Solo se permiten letras en el nombre");
            resultado = false;
        }

        return resultado;

    }

    private boolean esApellidoPaterno() {
        boolean resultado = true;
        if (Utilitario.esNulo(empleado.getApellidoPaterno().trim())) {
            Utilitario.enviarMensajeGlobalError("Ingrese apellido paterno");
            resultado = false;
        } else if (!Utilitario.esRangoValido(empleado.getApellidoPaterno(), 45)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracateres permitidos para el apellido paterno es 45 ");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(empleado.getApellidoPaterno())) {
            Utilitario.enviarMensajeGlobalError("Solo se permiten letras en el apellido paterno ");
            resultado = false;
        }
        return resultado;
    }

    private boolean esApellidoMaterno() {
        boolean resultado = true;
        if (Utilitario.esNulo(empleado.getApellidoMaterno().trim())) {
            Utilitario.enviarMensajeGlobalError("Ingrese apellido materno");
            resultado = false;
        } else if (!Utilitario.esRangoValido(empleado.getApellidoMaterno(), 45)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracateres permitidos para el apellido materno es 45 ");
            resultado = false;
        } else if (!Utilitario.esSoloLetras(empleado.getApellidoMaterno())) {
            Utilitario.enviarMensajeGlobalError("Solo se permiten letras en el apellido materno ");
            resultado = false;

        }
        return resultado;
    }

    private boolean esTelefono() {
        boolean resultado = true;
        if (!Utilitario.esNulo(empleado.getTelefono())) {
            if (!Utilitario.esRangoValido(empleado.getTelefono(), 8)) {
                Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos para el telefono es 8 ");
                resultado = false;
            } else if (!Utilitario.esSoloNumero(empleado.getTelefono())) {
                Utilitario.enviarMensajeGlobalError("Ingrese solo números en el telefono");
                resultado = false;
            }
        }
        return resultado;
    }

    private boolean esDireccion() {
        boolean resultado = true;
        if (!Utilitario.esNulo(empleado.getDireccion())) {

            if (!Utilitario.esRangoValido(empleado.getDireccion(), 200)) {
                Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitidos para direccion es 200");
                resultado = false;
            }
        }
        return resultado;
    }

    private boolean esCelular() {
        boolean resultado = true;

        if (!Utilitario.esNulo(empleado.getCelular())) {
            if (!Utilitario.esRangoValido(empleado.getCelular(), 9)) {
                Utilitario.enviarMensajeGlobalError("El maximo de caracateres permitidos para celular es 9");
                resultado = false;
            } else if (!Utilitario.esSoloNumero(empleado.getTelefono())) {
                Utilitario.enviarMensajeGlobalError("Ingrese solo numeros en celular");
                resultado = false;
            }
        }
        return resultado;
    }

    private boolean esDNI() {
        boolean resultado = true;
        if (Utilitario.esNulo(empleado.getDni())) {
            Utilitario.enviarMensajeGlobalError("Ingrese DNI");
            resultado = false;
        } else if (!Utilitario.esRangoValido(empleado.getDni(), 8, 8)) {
            Utilitario.enviarMensajeGlobalError("El maximo de caracteres permitos para DNI es 8");
            resultado = false;
        } else if (!Utilitario.esSoloNumero(empleado.getDni())) {
            Utilitario.enviarMensajeGlobalError("Ingrese solo numeros en DNI");
            resultado = false;
        }
        return resultado;
    }

    private boolean esTipoEmpleadoValido() {
        return empleado.getTipo().getId().intValue() != 0;
    }

    private void limpiar() {
        empleado = new Empleado();
    }

    public void exportar(){
        List<Exporter> datos = ((Paginador)empleados).getAllList();
        ExcelExporter da = new ExcelExporter(Empleado.class);
        da.agregarHeader("Empleados");
        da.crearDocumento(datos);
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        externalContext = ExcelExporter.getResponseContent(externalContext,"Lista_empleados");
        try {
            OutputStream outputStream = externalContext.getResponseOutputStream();
            da.exportarDocumento(outputStream);
            externalContext.setResponseStatus(200);
            externalContext.responseFlushBuffer();
            facesContext.responseComplete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * GETTERS AND SETTERS *
     */
    public LazyDataModel<Empleado> getEmpleados() {
        return empleados;
    }

    public void setEmpleados(LazyDataModel<Empleado> empleados) {
        this.empleados = empleados;
    }

    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public List<TipoEmpleado> getTiposEmpleado() {
        return tiposEmpleado;
    }

    public void setTiposEmpleado(List<TipoEmpleado> tiposEmpleado) {
        this.tiposEmpleado = tiposEmpleado;
    }

    public void setSesionControlador(SesionControlador sesionControlador) {
        this.sesionControlador = sesionControlador;
    }

   

    public List<Perfil> getPerfiles() {
        return perfiles;
    }

    public void setPerfiles(List<Perfil> perfiles) {
        this.perfiles = perfiles;
    }
    
     public Usuario getUser() {
        return user;
    }

    public void setUser(Usuario user) {
        this.user = user;
    }
    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }
    public LazyDataModel<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(LazyDataModel<Usuario> usuarios) {
        this.usuarios = usuarios;
    }
     public List<Usuario> getUsuario() {
        return usuario;
    }

    public void setUsuario(List<Usuario> usuario) {
        this.usuario = usuario;
    }
}
